Skip to content

Mute Modes 0.2.2-experimental: SHADOW out of the stock timestretch task's SRAM (owner review) - #1007

Merged
repeat98 merged 46 commits into
repeat98:mainfrom
Zac-Kyoti:mute-modes-0.2.2
Nov 5, 2026
Merged

repeat98 merged 46 commits into
repeat98:mainfrom
Zac-Kyoti:mute-modes-0.2.2

Conversation

@Zac-Kyoti

@Zac-Kyoti Zac-Kyoti commented Oct 28, 2026 •

Copy link
Copy Markdown
Contributor

Mute Modes 0.2.2-experimental. This is an author update, but it needs owner review: it touches shared files (the MUTE MODES table recipe pins, two test pins), and the USB base needs your table-owner decision. Details below.

0.2.2 carries three fixes: SHADOW out of the stock timestretch task's SRAM; KEYHOLD (rolled in on 3 Nov at your request, instead of a separate 0.2.3); and the OT-exit hold, which came out of Sam's question on KEYHOLD (sambanks/octabam#1013).

What changed

SHADOW. Hook 1 (pre, the frame-ISR hook) keeps a one-byte "silenced set", SHADOW. Until 0.2.1 it was SRAM 0x80006c66. That address lies inside the work area of a stock ColdFire task that runs the timestretch splice search and transient detection while tracks play, and refills that area with audio on every grain. Bryan T found the static sites; we traced the task.

  • In OTFX, an audio byte read back as the previous frame's silenced set could swallow a newly muted track's note-off, so the mute did not take.
  • In every mode, OT included, pre's per-frame write landed in the task's splice-search window.

SHADOW is now a byte inside mm_softmute. Every SHADOW operand is absolute long. The plain unit grows 968 → 970 bytes. The source comments name no address the published version did not. octabam has it at a1e0288 (sambanks/octabam#928, merged).

KEYHOLD (the SC_KEY / ev_mute_keep path only, so with Sidechain Compressor installed):

  • A muted track that a COMPRESSOR uses as its KEY plays its trigs, cut after the FX as on stock.
  • When KEY moved to another track, the muted track went back to its MUTE MODE. DT-T leaves a sounding voice alone, so the note it had started as a KEY played out at full level, and a looping sample kept going. OTFX-T and OTFX let one frame through.
  • Now a muted track that has been a KEY keeps stock's post-FX cut until it is unmuted. Its trigs are still dropped.

Found on sambanks/octabam#934; octabam pinned it with sambanks/octabam#1013.

The OT-exit hold (every unit, with or without Sidechain Compressor):

  • In MUTE MODE OT, stock plays a muted track's trigs under its post-FX cut.
  • When MUTE MODE was switched to a soft mode while a track was muted, the track went to that mode at once. DT-T leaves a sounding voice alone, so the note started in OT played to its end at full level, and a looping sample kept going. OTFX-T and OTFX let one frame through.
  • The same gap left a KEYHOLD bit set across an unmute in OT, because pre returns before p1_key there (Sam's question).
  • Now OT holds every track. A track still muted when MUTE MODE leaves OT keeps OT's cut until it is unmuted, as a former KEY track already did.

The hold byte is inverted (UNHELD, 0xff = nothing held) and sits just before SHADOW. So OT's clr.b SHADOW became one clr.w over both, and OT keeps its instruction count. The plain unit gets the hold too: 970 → 996 bytes. The SC_KEY unit is 1,106 bytes (1,086 in 0.2.1). octabam pins it with sambanks/octabam#1022.

Evidence

  • Source: Zac-Kyoti/octatrack-kyoti-fw bb9bead (modwerk-modules/mute-modes/), byte for byte; sdk/imports/mute-modes-bb9bead.json replaces mute-modes-826d23e.json. Author references: plain 64d876ca… at 0x400d7400, SC_KEY e622ca6b… at 0x400d6e54 (KYOTI V1.7's placement), menu 4c6702aa… (unchanged).
  • Native probe (qualification/run.py, reviewed container): 4,353,132 cases pass.
    • probe.cpp takes every unit address from the new units' symbol tables. Frame cases start with UNHELD = 0xff (nothing held).
    • KEYHOLD checks, per mode and mask pair: the hold is set for silenced key tracks, a frame with the keys gone keeps their cut, and unmuting releases it.
    • New, in both units, per soft mode and mute mask:
      • an OT frame clears UNHELD and SHADOW;
      • the next soft-mode frame keeps the cut on every muted track;
      • a mixed frame keeps the hold only on held tracks that are still muted;
      • a full unmute releases every track.
    • Breaking three of the new expectations one at a time makes the probe fail with the right message.
    • Cost: the worst bound goes 3,344 → 3,440 cycles (SC_KEY, OTFX), and the plain frame path 2,032 → 2,176. Per block at most 16,624, against a budget of 95,778. Per-trig paths are unchanged.
  • Hardware, on the author's MKI:
    • 3 Nov, MW_MMOH1: the native card image of Sidechain Compressor + Mute Modes with every stock effect kept, built from a2d9882b (MAIN OS d8267756…). All passed:
      • a track muted in OT stays silent when MUTE MODE is switched to DT-T, and plays normally when unmuted;
      • an ordinary DT-T mute of a sounding track still plays out;
      • in DT-T, a muted track resting as KEY stays silent when KEY moves away;
      • MUTE MODE survives a power cycle.
    • 3 Nov, MW_MMKH1 (KEYHOLD, before the OT-exit hold): the native card image of Sidechain Compressor + Mute Modes with every stock effect kept, built from 52a7586d (MAIN OS 2dfce546…). All passed:
      • in DT-T, a muted track resting as KEY stays silent when KEY moves away;
      • a muted KEY still ducks;
      • unmuting brings the track back;
      • a plain DT-T mute still plays out;
      • MUTE MODE sits after PREVIEW WITHOUT FX and survives a power cycle.
    • 27 Oct, MW_MM022: the image of this module alone, before KEYHOLD (MAIN OS 446ece69…). Every mode, solo in OTFX, 20–30 OTFX mutes of a timestretched loop, Part and project reload, and a power cycle all passed.
    • The same source passed on that unit as the standalone image, its Bugbuild, KYOTI V1.7 and the octabam form (OCTABAM39).
    • tests.evidenceRevision and the hardware record now point at a2d9882b / d8267756…. Limits are in tests.qualification.hardware.limitations and TESTING.md.
  • module:verify on current main: 0 mismatches of 162 selections (74 built, 88 matching refusals).
  • Packages: rebuilt in the isolated toolchain from the merge with current main and imported. USB package 0.2.2-experimental.mwrm: 2,754 B, d8b871e3…. Longest run shared with stock: 10 bytes; no check_stock_free hits.
  • Other modules' pins: Tape Echo's and Euclid's standalone recipes are re-pinned to the rebuilt asset files. Analog BD's proofs are re-exported natively (--suite analog-bd --static-stock --vendored-sdk, 8 shards, merged in the committed order): all 212 identical, and only moduleSourceTreeSha256 moves.
  • Test pins: requested-modules.test.ts, plain unit 970 → 996 B and SC_KEY unit 1086 → 1106 B.
  • Screenshots: the pages these changes could affect are unchanged. They are 0.2.2's captures from the Mute-Modes-only image.
  • main: merged twice on the way (generated asset conflicts only, taken from main, then rebuilt). Merges only, no rebase, so the evidence commits stay reachable.

Needs you

  1. Table owner and base. module-adapters/table-owners.json still names the 0.2.1 package and your 14 Oct declaration hash. The 0.2.2 package has a new hash. The declaration, its reviewed SHA-256 and the approval line are yours to make, so I have not regenerated them or the base. octatrack-base.test.ts is red until they are done (npm run octatrack:base -- --stock … --beta --write, then the base-bound packages).
  2. Load and stress benchmarks. Without an approval record, module:doctor asks for the frame-interrupt load capture and the 60-second flood run. 0.2.1 shipped with these waived. This version adds a few instructions to the frame path (worst case 3,344 → 3,440 cycles) and nothing elsewhere. Please add an approval record for 0.2.2 covering just those two rows if you agree, or say if you want the emulator runs.

Red on this branch, all from 1 and 2:

  • octatrack-base.test.ts: the committed base is stale.
  • module-doctor.test.mjs: the load and stress rows.
  • test_published_module_packages_rebuild_byte_for_byte: with the Tape Echo and Euclid pins fixed, it now rebuilds every package up to Mute Modes, then stops at "the private cave/table declaration does not name the exact source inputs", which is the 0.2.2 table-owner declaration.

pr:ready reports nothing else.

The release boxes are left unticked, because this is not an automatic update. When it is published, followers are notified after the 48-hour hold.

What the guides lacked: nothing in ADD_A_MODULE or MODULE_AUTHOR_UPDATES says that a Mute Modes source change also changes candidate-recipes.json and the reviewed table owner, and therefore the base, which makes every Mute Modes update owner-reviewed. Also, a module's qualification/probe.cpp counts as native source, so a probe-only change moves the qualification hash; and the probe needs mc68k mounted into the container and an exec-enabled /tmp. I can send a docs PR for these.

🤖 Generated with Claude Code

Zac-Kyoti added a commit to Zac-Kyoti/octatrack-kyoti-fw that referenced this pull request Oct 28, 2026
@repeat98

Copy link
Copy Markdown
Owner

Thanks, Zac. The fix is right: the seven operands, the source byte for byte against c5b24d0 and the probe all check out. I'll take it with one more base rebuild. Table owners pin the package hash today, so any Mute Modes byte change needs a new base. I'll open an issue to change that, so later updates don't.

The order: #943 and #944 merge first, since they rebuild the base too. Then this one merges main and regenerates its pins. After that I add the 0.2.2 table-owner declaration, the approval record and the new beta base.

One thing from your side: module-adapters/loader_mute_keep_fixture.cpp still seeds and reads SHADOW at 0x80006c66 (lines 26, 107 and 118), so its SHADOW check now passes without testing anything. Could you point it at the unit's byte in this PR?

@repeat98

Copy link
Copy Markdown
Owner

Hi @Zac-Kyoti, a heads-up and a request. #1007 ships as it is (owner's call). After that, Modwerk's base gets a PERSONALIZE rows table (ot_personalize_rows), so Mute Modes, Track Mutes (#931) and Play Start (#947) can all add rows in one build, and a Mute Modes update no longer needs a new base (#1010).

For Mute Modes that means: runtime.json contributes MUTE MODE's row to the table instead of growing stock's three tables, and patch_mutemode.s gains a 4-word row record (count, lbl/get/set) inside the existing .ifdef MODWERK_EVENTS block. Your native bytes and references are unchanged, and GATE stays at 0x800000dc. Over USB, MUTE MODE moves to the end of PERSONALIZE (just above LED BRIGHTNESS on an MKII).

OK if I make that change in the base PR? Happy to show the diff first.

@Zac-Kyoti

Copy link
Copy Markdown
Contributor Author

Thanks, Jannik. I'll point loader_mute_keep_fixture.cpp (26/107/118) at the unit's SHADOW byte in #1007.

On the rows table: I'm all for it, since dropping the per-update base rebuild is a clear win. One request on placement: could a row declare where it goes instead of always being appended? For example, an anchor naming the stock row it goes after (MUTE MODE after PREVIEW WITHOUT FX), with catalog order breaking ties when two modules pick the same anchor. LED BRIGHTNESS would stay last as now.

MUTE MODE belongs next to MUTE FOCUSES TRK. Putting it at the bottom splits the mute settings across the list, which I think is the wrong UX. It would also put the row in a different place over USB than in the card build, in our own builds and in octabam, which all use index 2. Nothing in the firmware depends on a PERSONALIZE row's index (only the menu code at 0x40068e00..0x40069074 reads the three tables), and the base already splices in front of LED BRIGHTNESS, so an anchored insert should be the same splice. Track Mutes (#931) would probably want to sit with the mute rows too.

Happy to look at the diff, and I can help with the anchor part if useful.

…t, not 0x80006c66

Since 0.2.2 hook 1's SHADOW is a byte inside mm_softmute, so the fixture
looks it up per installed package (fixture_image + the package's SHADOW
symbol), as it already does for KEYMASK. The plain raw build now gets its
symbol file too (plain.syms, already written by the test; argc 12 -> 13).

Run locally (private stock MAIN, native archives built from the upstream
checkout): passes in 16.5 s. Reading the plain build's SHADOW at the old
address instead makes it fail, so the check bites again.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@Zac-Kyoti

Copy link
Copy Markdown
Contributor Author

Pushed 40a7626: loader_mute_keep_fixture.cpp now seeds and reads SHADOW at each installed package's own byte (fixture_image + the package's SHADOW symbol, as it already does for KEYMASK), and the plain raw build gets its plain.syms (argc 12 -> 13). Ran it locally with a private stock MAIN and the native archives: passes. Pointing the plain build back at 0x80006c66 makes it fail, so the check tests something again.

@repeat98

Copy link
Copy Markdown
Owner

Thanks, Zac, and thanks for the fixture fix: seeding SHADOW at each package's own byte is the right test.

On placement: you're right. MUTE MODE should sit with the mute rows, and in the same place over USB as in the card build and in Octabam. I'll give ot_personalize_rows an anchor: a row names the stock row it goes after (MUTE MODE after PREVIEW WITHOUT FX), catalogue order breaks a tie between two modules on the same anchor, rows without an anchor go at the end, and LED BRIGHTNESS stays last. I'll do that in #1023 before it merges. Once #1007 is in, you'd only need the anchor in your row record. If you want to look at the diff then, I'd be glad of a second pair of eyes.

The order is unchanged: #944 merges first, then #1007 takes main and its regenerated pins, then I add the 0.2.2 table-owner declaration and the approval record.

@repeat98

Copy link
Copy Markdown
Owner

@Zac-Kyoti #944 (Analog BD 0.1.6) is merged, so this is next in the order. It needs current main merged in and its pins regenerated: the conflicts are only in the generated asset files. Could you do that? If you'd rather I do it, say so and I'll push the refresh to your branch. After that I add the 0.2.2 table-owner declaration and the approval record.

@Zac-Kyoti

Copy link
Copy Markdown
Contributor Author

Thanks, Jannik, the anchor plan sounds great; I'll take a look at #1023 when it's up.

Refreshed against main (3b79e797): merged rather than rebased, so the hardware report's pinned commit stays in the history. The conflicts were only in the generated assets. I took main's versions, rebuilt the packages from the merge (build-modules-isolated.sh + modules:import), and set the Analog BD proof header to the new source tree. The Mute Modes USB package reproduces byte for byte with main's tooling (40f5cc11…). module:verify again shows 0 mismatches of 162 selections, and the recipe pins all still match.

pr:ready is now down to your steps: the base (table owner), the doctor's load and stress rows (approval record), and the package-rebuild test, which stops on a standalone recipe before it reaches Mute Modes, as on main.

@repeat98

Copy link
Copy Markdown
Owner

Heads-up: the triage bot will mark this needs-work because of the red table-owner and approval rows. Those are my steps (the 0.2.2 table-owner declaration and the approval record), and I'm on them. Nothing for you to do; please don't push meanwhile so we don't collide.

@Zac-Kyoti

Copy link
Copy Markdown
Contributor Author

@repeat98 One more Mute Modes change to raise before you write the 0.2.2 table-owner declaration, since it pins patch_softmute.s.

We found a bug in the side-chain exemption (the SC_KEY / ev_mute_keep path) while chasing octabam#934:

  • A muted track that a COMPRESSOR uses as its KEY plays its trigs, cut after the FX.
  • When KEY moves to another track, the muted track goes back to its MUTE MODE. DT-T leaves a sounding voice alone, so the note it started as a KEY plays out at full level; a looping sample keeps going until the transport stops.
  • OTFX-T and OTFX let one frame through.

On Modwerk this applies whenever a module answers ev_mute_keep, i.e. with Sidechain Compressor installed.

The fix (KEYHOLD) keeps a muted track that has been a KEY cut until it's unmuted. It's one byte beside KEYMASK and five instructions in p1_key's tail.

Would you like it rolled into #1007 (0.2.2), or sent as 0.2.3 after #1007 merges? Rolling it in means new source, packages, native comparison, probes and a hardware run on a Modwerk image, so your declaration would wait for that. I won't push to the branch until you say which.

Zac-Kyoti and others added 2 commits November 2, 2026 15:01
…fter KEY moves away

The author's files at Zac-Kyoti/octatrack-kyoti-fw 826d23e (modwerk-modules/mute-modes/);
import record sdk/imports/mute-modes-826d23e.json replaces c5b24d0's. SC_KEY unit 1086 -> 1100 B,
author reference ac03f559... at 0x400d6e54 (KYOTI V1.7's placement); plain unit unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Zac-Kyoti and others added 8 commits November 3, 2026 17:14
74 native module-owned images match (26 identical outright, 48 outside the platform writes),
88 matching refusals.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… OT-exit hold checks (4,353,132 cases), cycle and size figures, test pins 996/1106 B

probe.cpp: every unit address and entry offset taken from the new units' symbol tables
(plain: mt_trig +370, mt_rebind +460, dt_trig +702, fresh_bind +788, trigflag +910,
UNHELD 0x400d77e2, SHADOW 0x400d77e3; SC_KEY: fresh_bind 0x400d71c6, UNHELD 0x400d72a2,
SHADOW 0x400d72a3, KEYMASK 0x400d72a4). Hold checks use the inverted byte; frame cases start
from UNHELD = 0xff. New checks, both units: an OT frame clears UNHELD and SHADOW; the next
soft-mode frame keeps the post-FX cut for every track muted at the OT exit; unmuting some
shrinks the hold while new mutes follow MUTE MODE (or KEY); unmuting all releases it.
Sabotaging any of the new expectations fails the probe. Worst bound 3,392 -> 3,440 (SC_KEY,
OTFX, three instructions); plain frame +9 instructions (2,032 -> 2,176). The table in
TESTING.md is regenerated from probes.json; the worst path is labelled OTFX (GATE 3), not OTFX-T.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… (hardware pending)

Static native build of Sidechain Compressor + Mute Modes, every stock effect kept: MAIN OS
d8267756..., mm_softmute (SC_KEY, 1106 B) at 0x400d7280; card file 2e55f106..., syx ef1077cd....

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ter limit

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ce; native comparison (0 mismatches of 162)

USB package d8b871e3... unchanged; recipe pins unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…t files

Only the assets' sourceCommit moved; test_published_module_packages_rebuild_byte_for_byte passes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…l 212 identical, only moduleSourceTreeSha256 moves

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… Compressor + Mute Modes on the author's MKI, all passed), evidence pin

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@Zac-Kyoti

Copy link
Copy Markdown
Contributor Author

@repeat98 The OT-exit hold is in, pushed as a fast-forward (53323766 → 09fe7dce; no merge needed, main is still 5f28c9a8). This is the last source change for 0.2.2 from my side, so the declaration can pin this patch_softmute.s.

  • Source: bb9bead, sdk/imports/mute-modes-bb9bead.json. Plain unit 996 B (64d876ca…), SC_KEY unit 1,106 B (e622ca6b…).
  • Packages: rebuilt in the isolated toolchain and imported. USB package d8b871e3… (2,754 B).
  • module:verify: 0 mismatches of 162.
  • Probe: every unit address now comes from the symbol tables, plus new OT-exit hold checks in both units. 4,353,132 cases pass. Worst bound 3,392 → 3,440 cycles; per block at most 16,624.
  • Hardware: MW_MMOH1 (Sidechain Compressor + Mute Modes, MAIN d8267756…) on my MKI, all checks passed. The record and evidenceRevision point at it.
  • Other modules' pins: Tape Echo and Euclid re-pinned, Analog BD's proofs re-exported (212 identical), as last time.

The reds are the same three as before, all waiting on the declaration and the approval record: the base test, the load and stress rows, and the package-rebuild test stopping at Mute Modes' table-owner declaration. The PR body is updated.

@repeat98 repeat98 mentioned this pull request Nov 4, 2026
2 of 7 tasks
repeat98 and others added 4 commits November 4, 2026 11:21
…main, rebuilt next)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ease date

- table-owners/mute-modes.recipe.json captured with build.py --octabam-tables
  mute-modes --capture-stock-recipe (the local build reproduces the committed
  0.2.2 package d8b871e3... byte for byte); the declaration names that package,
  its image, the recipe and the tables at 1332/1400/1468, and
  table_declarations.validate accepts it.
- table-owners.json names the 0.2.2 package and the declaration's reviewed
  SHA-256 078d3bf2..., approved by repeat98 on 4 Nov 2026.
- candidate-recipes.json pins octamod.module.json as committed in 09fe7dc
  (the evidence pin moved its hash).
- sdk/mute-modes-build-approval.json covers 0.2.2's exact native source and
  waives only the missing stock benchmark and stress rows; no owner unit run.
- The changelog entry is dated 4 Nov 2026.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… packages rebuilt from the merge

- npm run octatrack:base -- --stock ... --beta --write: base 462fbd2b2ee9...
  (was 9680e9ac...), its USB Audio variants with it; browser .bin equals
  build_core.py's. Arena, pool and symbols are unchanged, so the base-bound
  packages keep their bytes and only their requiredBase moves.
- build-modules-isolated.sh from e3a91ff, imported with --development: only
  the mute-modes version, the source commit and Mute Modes' requested objects
  change against main's assets.
- Tape Echo's and Euclid's standalone recipes re-pinned to the rebuilt asset
  files; Analog BD's proof header names the new module source tree.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Zac-Kyoti added a commit to Zac-Kyoti/modwerk that referenced this pull request Nov 4, 2026
… build_bus after compose_map

tools/remix is again the base's byte for byte, so the reviewed pins over tools/remix/*.py
(the standalone recipes, Mute Modes' table declaration on repeat98#1007) do not move with this change.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@repeat98

repeat98 commented Nov 5, 2026

Copy link
Copy Markdown
Owner

Thanks, Zac, for KEYHOLD, the OT-exit hold and the MW_MMOH1 run. I've pushed my part to your branch as a fast-forward on top of 09fe7dce: the 0.2.2 table-owner declaration (it pins this patch_softmute.s), the beta base built with it, current main merged in, the changelog date, and an approval record for 0.2.2. The record waives only the frame-interrupt load and flood stress rows. Your MKI run stays the hardware record, and the USB package and the MKII are listed as not run. The checks are green, so I'm merging it now.

Yes please to the docs PR you offered for what the guides were missing. One note on the first point: once #1023 lands, a Mute Modes update won't move the table owner or the base any more, so that one can be a single sentence that says so. The other two points still apply: probe.cpp counts as native source, and the probe needs mc68k and an exec-enabled /tmp.

When you have a moment after the release, could you do one USB install of 0.2.2 on your MKI on the beta base (install, Keep, set MUTE MODE, remove)? That would be the first run of the USB package on a unit. It isn't blocking anything.


Generated by Claude Code

@repeat98
repeat98 merged commit 4cc77f7 into repeat98:main Nov 5, 2026
8 checks passed
repeat98 added a commit to ex1010/modwerk that referenced this pull request Nov 5, 2026
…417)

main's repeat98#1007 moved the beta base to 462fbd2b. The generated base assets
were taken from main and rebuilt on the merged source, so FR 1 sits on
main's new base: npm run octatrack:base -- --stock OS.bin --beta --write
(base 9b3ba417...), then npm run octatrack:module-packages -- --base-only
--stock OS.bin: only requiredBase moved.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
repeat98 pushed a commit that referenced this pull request Nov 5, 2026
…er's mc68k and exec /tmp; Mute Modes updates and the table owner until #1023

From Mute Modes 0.2.2 (#1007).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@Zac-Kyoti

Copy link
Copy Markdown
Contributor Author

@repeat98 Happy to do the USB run of Mute Modes 0.2.2 on my MKI (install, Keep, set MUTE MODE, remove). Could you grant beta access to the Zac-Kyoti account on modwerk.app? I don't have the Octatrack page or the base install yet. I'll report the results here once it's done.

The docs PR you said yes to is #1251.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants